package com.bj58.mis.apm.server.kylin.util;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 时间相关处理工具
 */
public class TimeUtil {
    /**
     * 默认格式
     */
    private static String FORMAT_DEFAULT = "yyyy-MM-dd HH:mm:ss SSS";

    private static Map<String, SimpleDateFormat> sfMap = new HashMap<>();

    /**
     * 按默认格式格式化时间
     * @param date
     * @return
     */
    public static String format(Date date){
        return format(date, FORMAT_DEFAULT);
    }

    /**
     * 自定义格式话时间
     * @param date
     * @param format
     * @return
     */
    public static String format(Date date, String format){
        SimpleDateFormat sf = sfMap.get(format);
        if(sf == null){
            sf = new SimpleDateFormat(format);
            sfMap.put(format, sf);
        }
        return sf.format(date);
    }

    /**
     * 格式化时长
     * @param l 毫秒时长
     * @return
     */
    public static String duration(long l){
        BigDecimal date = new BigDecimal(l);
        BigDecimal b1 = new BigDecimal(60000);
        BigDecimal b2 = new BigDecimal(60);
        BigDecimal b3 = new BigDecimal(1000);
        StringBuilder sb = new StringBuilder();
        if(l >= 0) {

            BigDecimal[] r = date.divideAndRemainder(b1);
            sb.append(r[1].divide(b3).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + "秒");
            if(r[0].longValue() > 0) {
                r = r[0].divideAndRemainder(b2);
                sb.insert(0, r[1].longValue() + "分钟");
                if(r[0].longValue() > 0){
                    sb.insert(0, r[0].longValue() + "小时");
                }
            }
        }
        return sb.toString();
    }

    /**
     * 格式化时长
     * @param start 开始时间
     * @param end 结束时间
     * @return
     */
    public static String duration(long start, long end){
        return duration(end - start);
    }

    public static Date parseDate(String str){
        return parseDate(str, FORMAT_DEFAULT);
    }

    public static Date parseDate(String str, String format){
        SimpleDateFormat sf = sfMap.get(format);
        if(sf == null){
            sf = new SimpleDateFormat(format);
            sfMap.put(format, sf);
        }
        try {
            return sf.parse(str);
        }catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

}
